package com.fzzz.kotlindemo

/**
 * Created by Shen Chao
 * Created by 2018-12-07
 */
//class ApiTest

fun main(args: Array<String>) {
//    arrayTest()
//    nullTest()
//    forTest(8)
//    _Test()
//    testFormat()
    print(getString(123))
}

fun testFormat() {
    //混合开发，直接用会报错 java.lang.IllegalStateException: Utils.format("") must not be null
//    val s: String = Utils.format("")
//    print("s:" + s.length)

    //第一种处理
//    val s: String = Utils.format("") ?: ""
//    print("s:" + s.length)

    //第二种处理
//    val s: String? = Utils.format("")
//    print("s:" + s.length) //红线报错
//    print("s:" + s?.length)

    //第三种
    //让kotlin做变量类型推断，会报异常 java.lang.NullPointerException
//    val s = Utils.format("")
//    print("s:" + s.length)

    //第四种
    //强制推断变量类型，会报异常 kotlin.KotlinNullPointerException
    val s = Utils.format("")!!
    print("s:" + s.length)
}

//kotlin方法和java相反，方法名和入参在前面，返回类型再后边
fun getString(i: Int): String {
    //java中先定义类型，输变量名的时候会有推荐，kotlin变量名在前面，基本上只能自己手输，command + option + v返回的变量名不会有类型
//    val format = Util.format("a")
    return i.toString()
}

fun _Test() {
    //其中User声明了name,age两个变量。解构时若只要name一个变量时，可以这么做：
    val user = User("tom", 12)
    val (name, _) = user
    println(name)
}

fun nullTest() {
    //? 可为空值 有值输出，无值输出null，不报异常
    val s: String? = null;

//    println(s?.length)
    //KotlinNullPointerException
    println(s!!.length)
}

fun forTest(i: Int) {
    when (i) {
        1 ->
            //名称遮蔽，方法传参是i，方法里边还可以定义参数为i, 但是工具会给个警告
//            for (i in 1..10) println(i)
            for (j in 1..10) println(i)
        2 ->
            //使用until函数,创建一个不包括其结束元素的区间
            for (j in 1 until 10) println(i)
        3 ->
            for (j in 1..10) println(i)
        4 ->
            //无意义，什么都不会输出
            for (j in 10..1) println(i)
        5 ->
            for (j in 10 downTo 1) println(i)
        6 ->
            for (j in 1..10 step 2) println(i)
        7 ->
            for (j in 10 downTo 1 step 2) println(i)
        8 ->
            loop@ for (i in 1..5) {
                println(i)
                if (i == 3) {
                    break@loop
                }
            }
    }
}

fun arrayTest() {
    //定长数组
    val arrays1 = arrayOfNulls<Int>(10)
    //空数组
    val empty = emptyArray<Int>()
    val arrays2 = intArrayOf(1, 2, 3, 4, 5)
    //闭包初始化
    val array = Array(10, { num -> num })

    arrays1[4] = 9
//    println(Arrays.toString(arrays1))

    //遍历
    for (i in array) {
//        println(i)
        when (i) {
            in 1..3 -> println("1到3之间")
            4 -> println("等于4")
            5, 6, 7 -> println("输出结果${array[i]}")
            else -> println("其他")
        }
    }

//    for (i in arrays2.indices){
//        println(arrays2[i])
//    }
}